import wx

class Mywin(wx.Frame):
    def __init__(self, parent, title):
        super(Mywin, self).__init__(parent, title=title, size=(350, 250))

        panel = wx.Panel(self)
        # 垂直布局容器
        vbox = wx.BoxSizer(wx.VERTICAL)
        # 产生第一个水平布局容器，也就是第一行
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        # 第一个控件字段标题
        l1 = wx.StaticText(panel, -1, "Text Field")
        # 加入第一行
        hbox1.Add(l1, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        # 第一个控件的文本输入框
        self.t1 = wx.TextCtrl(panel)
        # 加入第一行
        hbox1.Add(self.t1, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        # 为第一个输入框绑定了输入事件的方法，用户输入时触发OnKeyTyped方法
        self.t1.Bind(wx.EVT_TEXT, self.OnKeyTyped)
        # 第一行（水平布局）加入到垂直布局（整个界面）
        vbox.Add(hbox1)

        # 第二行
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        l2 = wx.StaticText(panel, -1, "password field")

        hbox2.Add(l2, 1, wx.ALIGN_LEFT | wx.ALL, 5)
        self.t2 = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
        self.t2.SetMaxLength(5)  # 最大长度是5

        hbox2.Add(self.t2, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        vbox.Add(hbox2)
        # 密码输入框绑定最大长度事件：输入的内容超过5字符之后，触发OnMaxLen方法
        self.t2.Bind(wx.EVT_TEXT_MAXLEN, self.OnMaxLen)

        # 第三行
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        l3 = wx.StaticText(panel, -1, "Multiline Text")

        hbox3.Add(l3, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        # wx.TE_PROCESS_ENTER：能够处理回车键的标识
        self.t3 = wx.TextCtrl(panel, size=(200, 100),
                              style = wx.TE_MULTILINE | wx.TE_PROCESS_ENTER)

        hbox3.Add(self.t3, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        vbox.Add(hbox3)
        # 给多行文本输入框绑定回车按键事件：用户按下回车键触发OnEnterPressed
        self.t3.Bind(wx.EVT_TEXT_ENTER, self.OnEnterPressed)

        hbox4 = wx.BoxSizer(wx.HORIZONTAL)
        l4 = wx.StaticText(panel, -1, "Read only text")

        hbox4.Add(l4, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        self.t4 = wx.TextCtrl(panel, value="ReadOnly Text",
                              style = wx.TE_READONLY|wx.TE_CENTER)

        hbox4.Add(self.t4, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5)
        vbox.Add(hbox4)
        panel.SetSizer(vbox)

        self.Centre()
        self.Show()
        self.Fit()

    def OnKeyTyped(self, event):
        print(f'用户正在输入，当前内容：{event.GetString()}')
        # print(event.GetString())

    def OnEnterPressed(self, event):
        print("按了回车键")

    def OnMaxLen(self, event):
        print("字符超过了")

app = wx.App()
Mywin(None, 'TextCtrl demo')
app.MainLoop()
